package com.telit.firecommand.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.telit.common.entity.AppTask;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;


/**
 * <p>
 * 任务表 Mapper 接口
 * </p>
 *
 * @author yummy
 * @since 2021-07-22
 */
@Repository
public interface AppTaskDao extends BaseMapper<AppTask> {

    String selectStatusById(Long taskId);

    /**
     * 根据任务类型查询数据
     *
     * @param iPage
     * @param taskType
     *
     * @return
     */
    IPage<AppTask> searchTaskByType(IPage<AppTask> iPage, @Param("taskType") Integer taskType);

    /**
     * 根据条件查询任务数据
     *
     * @param iPage
     * @param taskType
     * @param startCreateTime
     * @param endCreateTime
     * @param status
     *
     * @return
     */
    IPage<AppTask> queryTotalTaskByCondition(IPage<AppTask> iPage, @Param("taskType") String taskType,
                                             @Param("startCreateTime") String startCreateTime
            , @Param("endCreateTime") String endCreateTime, @Param("status") String status
            , @Param("startExecuteTime") String startExecuteTime, @Param("endExecuteTime") String endExecuteTime);

    /**
     * 通过任务id和执行时间查询
     *
     * @param taskId
     * @param startExecuteTime
     * @param endExecuteTime
     *
     * @return
     */
    List<Long> queryTotalByExecuteTime(@Param("taskId") Long taskId, @Param("startExecuteTime") String startExecuteTime,
                                       @Param("endExecuteTime") String endExecuteTime);

    /**
     * 根据taskid查询任务开始执行时间
     *
     * @param taskId
     * @param startExecuteTime
     * @param endExecuteTime
     *
     * @return
     */
    Date queryStartExecuteTime(@Param("taskId") Long taskId, @Param("startExecuteTime") String startExecuteTime,
                               @Param("endExecuteTime") String endExecuteTime);

    /**
     * 查询任务结束时间
     *
     * @param taskId
     *
     * @return
     */
    Date queryEndTime(@Param("taskId") Long taskId);

    /**
     * 根据无人机code查询任务
     *
     * @param uavCode
     *
     * @return
     */
    List<AppTask> queryTaskByUavCode(@Param("uavCode") String uavCode);

    /**
     * 查询任务类型
     *
     * @param taskId
     *
     * @return
     */
    String queryType(@Param("taskId") Long taskId);

    /**
     * 查询巡护轨迹
     *
     * @param taskId
     * @param userId
     *
     * @return
     */
    String queryPatrolPointCollection(@Param("taskId") Long taskId, @Param("userId") Long userId);

    /**
     * 根据任务id查询执行人id
     *
     * @param taskId
     *
     * @return
     */
    List<Long> queryExecutePersonId(@Param("taskId") Long taskId);

    /**
     * 根据子任务id查询主任务状态
     *
     * @param subTaskId
     *
     * @return
     */
    String queryStatus(@Param("subTaskId") Long subTaskId);

    /**
     * 根据子任务id修改主任务状态
     *
     * @param subTaskId
     * @param status
     */
    void changeStatus(@Param("subTaskId") Long subTaskId, @Param("status") String status);

    /**
     * 修改子任务状态
     *
     * @param subTaskId
     * @param status
     */
    void changeSubTaskStatus(@Param("subTaskId") Long subTaskId, @Param("status") String status);

    /**
     * 查询除了自己之外的所有未完成子任务
     *
     * @param subTaskId
     *
     * @return
     */
    List<Long> queryNotFinishSubTaskWithoutSelf(@Param("subTaskId") Long subTaskId);

    /**
     * 根据子任务id修改主任务完成时间
     *
     * @param subTaskId
     * @param date
     */
    void changeFinishTime(@Param("subTaskId") Long subTaskId, @Param("date") Date date, @Param("status") String status);


    /**
     * 查询待执行巡护任务
     *
     * @param fireId
     *
     * @return
     */
    Integer queryPatrolPendingExecuteNumber(@Param("fireId") Long fireId);

    /**
     * 查询执行中巡护任务
     *
     * @param fireId
     *
     * @return
     */
    Integer queryPatrolUnderExecuteNumber(@Param("fireId") Long fireId);

    /**
     * 查询已完成巡护任务
     *
     * @param fireId
     *
     * @return
     */
    Integer queryPatrolHasFinishedeNumber(@Param("fireId") Long fireId);

    /**
     * 查询待执行巡航任务
     *
     * @param fireId
     *
     * @return
     */
    Integer queryCruisePendingExecuteNumber(@Param("fireId") Long fireId);

    /**
     * 查询执行中巡航任务
     *
     * @param fireId
     *
     * @return
     */
    Integer queryCruiseUnderExecuteNumber(@Param("fireId") Long fireId);

    /**
     * 查询已完成巡航任务
     *
     * @param fireId
     *
     * @return
     */
    Integer queryCruiseHasFinishedeNumber(@Param("fireId") Long fireId);

    /**
     * 根据火情id查询巡护任务列表
     *
     * @param iPage
     *
     * @return
     */
    IPage<AppTask> queryPatrolTaskByFireId(IPage<AppTask> iPage, @Param("fireId") Long fireId,
                                           @Param("status") String status);

    /**
     * 根据火情id查询巡航任务列表
     *
     * @param iPage
     *
     * @return
     */
    IPage<AppTask> queryCruiseTaskByFireId(IPage<AppTask> iPage, @Param("fireId") Long fireId,
                                           @Param("status") String status);

    /**
     * 查询任务执行中无人机名称
     *
     * @param uavUserId
     *
     * @return
     */
    String queryExecuteUavCode(@Param("uavUserId") Long uavUserId);

    /**
     * 查询已完成任务无人机名称
     *
     * @param taskId
     * @param uavUserId
     *
     * @return
     */
    String queryFinishUavCode(@Param("taskId") Long taskId, @Param("uavUserId") Long uavUserId);

    /**
     * 查询单个护林员的任务
     *
     * @return
     */
    IPage<AppTask> querySimplePersonTotalTaskByCondition(IPage<AppTask> iPage, @Param("taskType") String taskType,
                                                         @Param("startCreateTime") String startCreateTime,
                                                         @Param("endCreateTime") String endCreateTime,
                                                         @Param("status") String status,
                                                         @Param("forestkeeperId") Long forestkeeperId,
                                                         @Param("startExecuteTime") String startExecuteTime,
                                                         @Param("endExecuteTime") String endExecuteTime);

    /**
     * 根据任务类型和状态查询任务数量
     *
     * @return
     */
    Integer selectCountByStatusAndTaskType(@Param("statusList") List<String> statusList,
                                           @Param("taskType") String taskType, @Param("userId") Long userId);

    AppTask selectRealParamsById(@Param("id") Long id);

}
